const COS = require('cos-nodejs-sdk-v5');
const fs = require('fs');
const path = require('path');
const { v1: uuidv1 } = require('uuid');
const multer = require('multer');

// 配置multer存储
const storage = multer.memoryStorage(); // 使用内存存储
const upload = multer({
    storage: storage,
    limits: {
        fileSize: 100 * 1024 * 1024 // 限制100MB
    }
}).single('file');

// 腾讯云COS配置（使用上海存储桶）
const cos = new COS({
    SecretId: "AKIDOcdeYI0f8jARXQ6XklkdN8oR1RdgaHmE",
    SecretKey: 'LTREpDOGyUnunW3OVO3Ztzub4JLAl9JK',
});

// 导出对象，供其它模块调用
module.exports = thisFunction;

/**
 * 上传图片到腾讯云COS（上海存储桶）
 * 接收 multipart/form-data 格式的文件上传
 */
async function thisFunction(req, res) {
    // 使用multer处理上传
    upload(req, res, async function (err) {
        if (err) {
            console.error('文件上传错误:', err);
            return res.json({
                code: 500,
                msg: '文件上传失败: ' + err.message,
                data: null
            });
        }

        try {
            // 检查是否有上传的文件
            if (!req.file) {
                return res.json({
                    code: 400,
                    msg: '请选择要上传的文件',
                    data: null
                });
            }

            const uploadedFile = req.file;
            const artPptNum = req.body.artPptNum || 'default';

            // 获取文件扩展名
            const fileExt = path.extname(uploadedFile.originalname).substring(1) || 'jpg';

            // 生成唯一文件名
            const fileName = `${uuidv1()}.${fileExt}`;

            // 获取当前年月（YYYYMM格式）
            const now = new Date();
            const yearMonth = `${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, '0')}`;

            // 构建上传路径：pptImages/年月/artPptNum/文件名
            const uploadKey = `pptImages/${yearMonth}/${artPptNum}/${fileName}`;

            // 设置 ContentType
            let contentType = uploadedFile.mimetype || 'application/octet-stream';
            if (/^(jpg|jpeg)$/i.test(fileExt)) {
                contentType = 'image/jpeg';
            } else if (/^png$/i.test(fileExt)) {
                contentType = 'image/png';
            } else if (/^gif$/i.test(fileExt)) {
                contentType = 'image/gif';
            } else if (/^webp$/i.test(fileExt)) {
                contentType = 'image/webp';
            } else if (/^bmp$/i.test(fileExt)) {
                contentType = 'image/bmp';
            }

            // 上传到腾讯云COS（使用buffer）
            await uploadToCOS(uploadedFile.buffer, uploadKey, contentType);

            // 构建完整URL
            const imageUrl = `https://ppt-1375951275.cos.ap-shanghai.myqcloud.com/${uploadKey}`;

            // 返回成功响应
            return res.json({
                code: 200,
                msg: '上传成功',
                data: {
                    url: imageUrl,
                    key: uploadKey
                }
            });

        } catch (error) {
            console.error('上传失败:', error);
            return res.json({
                code: 500,
                msg: '上传失败: ' + error.message,
                data: null
            });
        }
    });
}

/**
 * 上传文件到COS（支持重试）
 */
function uploadToCOS(fileBuffer, uploadKey, contentType, retryCount = 0) {
    return new Promise((resolve, reject) => {
        cos.putObject({
            Bucket: 'ppt-1375951275', // 上海存储桶
            Region: 'ap-shanghai', // 上海区域
            Key: uploadKey,
            Body: fileBuffer,
            ContentType: contentType,
        }, function(err, data) {
            if (err) {
                console.error('COS上传失败:', err);

                // 重试逻辑（最多3次）
                if (retryCount < 3) {
                    console.log(`上传失败，${3000}ms后进行第${retryCount + 1}次重试...`);
                    setTimeout(() => {
                        uploadToCOS(fileBuffer, uploadKey, contentType, retryCount + 1)
                            .then(resolve)
                            .catch(reject);
                    }, 3000);
                } else {
                    reject(err);
                }
            } else {
                console.log('COS上传成功:', uploadKey);
                resolve(data);
            }
        });
    });
}
